Skip to content

비밀번호 재설정 기능 구현 및 추가 요구사항 적용#24

Merged
sgn07124 merged 12 commits intomainfrom
feat/session
Aug 17, 2025
Merged

비밀번호 재설정 기능 구현 및 추가 요구사항 적용#24
sgn07124 merged 12 commits intomainfrom
feat/session

Conversation

@sgn07124
Copy link
Owner

@sgn07124 sgn07124 commented Aug 17, 2025

User description

관련 이슈 (Related Issues)


PR Type

Enhancement, Bug fix, Tests


Description

  • 비밀번호 재설정 OTP/토큰 플로우 추가

  • 세션 조회 API 추가(/auth/me)

  • 질문 목록 페이징 도입 및 DTO 수정

  • CORS/보안 설정 개선 및 테스트 보강


Diagram Walkthrough

flowchart LR
  A["AuthController"] -- "GET /auth/me" --> B["AuthService.getSessionInfo"]
  A -- "POST /otp/sendEmail" --> C["PasswordResetService.requestOtp"]
  A -- "POST /otp/verify" --> D["PasswordResetService.verifyOtp"]
  A -- "POST /password/reset" --> E["PasswordResetService.resetPassword"]
  D -- "발급 resetToken" --> E
  C --- F["PasswordMapper.upsertPasswordOtp"]
  D --- F
  E --- G["AuthMapper.updatePasswordByEmail"]
  H["QuestionController"] -- "GET /question?page&size" --> I["QuestionService.getQuestions"]
  I --- J["AnswerMapper.find...Paged / count"]
  H -- "POST /{qid}/answer" --> K["AnswerService.saveAnswer"]
  K --- L["AnswerMapper.insertAnswer (key)"]
Loading

File Walkthrough

Relevant files
Enhancement
25 files
AuthController.java
세션 조회 및 비밀번호 재설정 엔드포인트 추가                                                               
+33/-0   
AuthRequest.java
OTP/재설정 요청 DTO 및 응답 추가                                                                     
+13/-0   
AuthResponse.java
세션 정보 MeDto 응답 추가                                                                               
+8/-0     
PasswordVerification.java
비밀번호 인증/토큰 엔티티 신설                                                                               
+61/-0   
AuthErrorCode.java
OTP/재설정 관련 에러코드 확장                                                                             
+11/-2   
AuthMapper.java
이메일로 비밀번호 업데이트 메서드 추가                                                                       
+3/-0     
PasswordMapper.java
OTP/재설정 토큰용 매퍼 추가                                                                               
+33/-0   
AuthService.java
세션 조회 서비스 시그니처 추가                                                                               
+4/-0     
AuthServiceImpl.java
로그인 세션 보강 및 세션 조회 구현                                                                         
+16/-0   
PasswordResetService.java
비밀번호 재설정 서비스 인터페이스 추가                                                                       
+9/-0     
PasswordResetServiceImpl.java
OTP 발송·검증·재설정 로직 구현                                                                           
+165/-0 
QuestionController.java
답변 저장 응답 수정 및 페이징 파라미터 추가                                                               
+9/-5     
AnswerResponse.java
AnswerDto 필드 축소 및 명확화                                                                       
+1/-2     
PageResponse.java
공통 페이지 응답 DTO 추가                                                                                 
+22/-0   
AnswerMapper.java
질문 목록 페이징/카운트 쿼리 추가                                                                           
+4/-0     
AnswerService.java
답변 저장 반환 타입을 DTO로 변경                                                                         
+2/-1     
QuestionService.java
질문 목록 조회를 페이징으로 변경                                                                             
+2/-2     
AnswerServiceImpl.java
답변 저장 시 ID 반환 및 피드백 트리거                                                                   
+4/-1     
QuestionServiceImpl.java
페이징 적용 및 안전한 page/size 처리                                                               
+10/-3   
SecurityUtil.java
PasswordEncoder 위임 matches/encode 추가                                         
+26/-0   
ApiSuccessCode.java
ME_SUCCESS 코드 추가                                                                                 
+2/-1     
SecurityConfig.java
CORS 적용 및 퍼블릭 경로 확장                                                                           
+4/-1     
answer-mapper.xml
키 자동생성 및 페이징/카운트 쿼리 추가                                                                     
+12/-4   
auth-mapper.xml
이메일 기반 비밀번호 업데이트 쿼리                                                                           
+7/-0     
password-mapper.xml
OTP/재설정 토큰용 SQL 매퍼 신설                                                                       
+77/-0   
Documentation
2 files
AuthControllerDocs.java
세션/OTP/재설정 API 스펙 문서화                                                                       
+14/-0   
QuestionControllerDocs.java
질문 목록 페이징 스펙 문서화                                                                                 
+7/-2     
Configuration changes
3 files
CorsConfig.java
CORS 전용 설정 빈 추가                                                                                   
+25/-0   
WebConfig.java
CORS 허용 도메인/메서드 확장                                                                             
+3/-2     
sql-map-config.xml
PasswordVerification 타입 별칭 등록                                                       
+1/-0     
Tests
4 files
AuthControllerTest.java
OTP/재설정 컨트롤러 테스트 추가                                                                           
+131/-0 
PasswordResetServiceImplTest.java
비밀번호 재설정 서비스 단위 테스트                                                                           
+290/-0 
AnswerServiceImplTest.java
답변 저장 반환값 및 상호작용 검증                                                                           
+34/-39 
QuestionServiceImplTest.java
페이징 로직 및 상한 검증 테스트                                                                             
+61/-8   

@sgn07124 sgn07124 self-assigned this Aug 17, 2025
@sgn07124 sgn07124 added ✨ Feature 새로운 기능 추가 ✅ Test 테스트 코드 추가 및 수정 labels Aug 17, 2025
@sgn07124 sgn07124 linked an issue Aug 17, 2025 that may be closed by this pull request
5 tasks
@github-actions
Copy link

github-actions bot commented Aug 17, 2025

PR Reviewer Guide 🔍

(Review updated until commit 2dfc353)

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 4 🔵🔵🔵🔵⚪
🧪 PR contains tests
🔒 Security concerns

- Sensitive information exposure:
OTP/비밀번호 재설정 관련 응답에서 이메일 존재 여부를 숨기는 처리가 잘 되어 있습니다. 다만, CORS 허용 도메인이 로컬 호스트로 제한되어 있어 운영 환경 전환 시 적절한 origin 화이트리스트 관리가 필요합니다.

  • Token handling: 비밀번호 재설정 토큰을 DB에 저장하고 사용 후 무효화하는 흐름은 적절합니다. 추가로 토큰 발급/검증 시 고유 제약 및 인덱스 확인, 토큰 길이/형식 검증을 고려하면 좋습니다.
  • No other critical issues spotted.
⚡ Recommended focus areas for review

Validation Rule

비밀번호 정규식이 소문자 요구 조건을 포함하지 않아 설명과 불일치합니다. 현재 패턴은 대문자와 특수문자만 강제합니다. 요구사항에 맞게 소문자 조건을 포함하거나 메시지를 패턴에 맞게 수정해 주세요.

public static record ResetReq(
        @NotBlank String resetToken,
        @NotBlank(message = "비밀번호는 필수입니다.") @Pattern(regexp = "^(?=.*[A-Z])(?=.*[@$!%*?&]).{8,16}$", message = "비밀번호는 영문 소문자, 대문자, 특수 문자로 구성되어야 합니다.") String newPassword
) {}
Crypt API Mix

OTP 해싱에 BCrypt를 직접 사용하고 검증에는 SecurityUtil(PasswordEncoder)을 사용하고 있습니다. 해싱/검증 알고리즘을 일관되게 맞추지 않으면 불일치 위험이 있으므로 동일한 PasswordEncoder를 사용하도록 정리하는 것이 좋습니다.

String codeHash = BCrypt.hashpw(code, BCrypt.gensalt());
LocalDateTime now = LocalDateTime.now();
LocalDateTime expiresAt = now.plusMinutes(EXPIRE_MINUTES);

passwordMapper.upsertPasswordOtp(email, codeHash, DEFAULT_ATTEMPTS, false, expiresAt, now);

String title = "InsightPrep 비밀번호 재설정 인증 코드";
String content = """
        <html>
          <body>
            <h1>비밀번호 재설정 인증 코드</h1>
            <p style="font-size:18px;"><b>%s</b></p>
            <p>해당 코드를 10분 내에 입력해 주세요.</p>
            <hr/>
            <p style="color: grey; font-size: small;">
              ※본 메일은 자동발송 메일입니다. 회신하지 마세요.
            </p>
          </body>
        </html>
        """.formatted(code);

try {
    emailService.sendEmail(email, title, content);
} catch (MessagingException | RuntimeException e) {
    throw new RuntimeException("메일 전송 실패", e);
}
Double CORS Config

WebMvcConfigurer와 별도 CorsConfigurationSource를 동시에 등록했습니다. 설정 충돌이나 중복 가능성이 있어 하나로 일원화하거나 우선순위를 명확히 하는 것이 안전합니다.

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration cfg = new CorsConfiguration();
        cfg.setAllowedOrigins(List.of("http://localhost:5173", "http://localhost:8080"));
        cfg.setAllowedMethods(List.of("GET","POST","PUT","DELETE","OPTIONS"));
        cfg.setAllowedHeaders(List.of("*"));
        cfg.setAllowCredentials(true);
        cfg.setMaxAge(3600L);

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", cfg);
        return source;
    }
}

@github-actions
Copy link

Persistent review updated to latest commit 2dfc353

@sgn07124 sgn07124 merged commit 8a00233 into main Aug 17, 2025
2 checks passed
@sgn07124 sgn07124 deleted the feat/session branch August 17, 2025 08:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Review effort 4/5 ✨ Feature 새로운 기능 추가 ✅ Test 테스트 코드 추가 및 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

로그인 확인 및 비밀번호 찾기 기능 구현

1 participant